//
// Created by 17328 on 2025/8/18.
//
#include <cstdio>
#include "com_cxp_test_dll_DllFuncService.h"
#include "../AGC/Agc.h"
#include "../AGC/AgcReturn.h"

// env：JNI环境指针，提供了访问Java虚拟机功能的接口，通过它可以调用Java方法、访问Java对象等;
// obj: 表示调用该native方法的Java对象实例，即dll_DllFuncService类的实例;
// in: 输入的float数组参数，通常用于传递需要处理的数据到native层; 【装机容量, 数组长度, 数组长度的参数】
// out: 输出的float数组参数，通常用于将处理结果从native层返回给Java层;【返回的参数（数组长度）】
JNIEXPORT jint JNICALL Java_com_cxp_test_dll_DllFuncService_AgcInitFun
  (JNIEnv* env, jobject obj, jfloatArray in, jfloatArray out) {
  float* inArray =  env -> GetFloatArrayElements(in, JNI_FALSE);
  // 1. 调用业务逻辑
  AgcReturn::getInstance()->SetAgcReturnParameters(inArray);
  // 2. 设置返回参数，对 out 进行赋值。
  env->SetFloatArrayRegion(out, 0, env->GetArrayLength(out), AgcReturn::getInstance()->AgcReturnParameters);
  // 3. 调试模式：打印数组长度和内容
  jsize length = env->GetArrayLength(in);
  printf("[DEBUG] Input array length: %d\n", (int)length);
  for (int i = 0; i < length; i++) {
    printf("[DEBUG] inArray[%d] = %f\n", i, inArray[i]);
  }
  // 4. 释放数组资源（必须调用！）
  // GetFloatArrayElements 和 ReleaseFloatArrayElements 是成对出现的，必须配对。
  env->ReleaseFloatArrayElements(in, inArray, JNI_ABORT);
  // 5. 刷新标准输出缓冲区，确保之前的 printf 输出立即显示(就是将日志立即输出)
  fflush(stdout);
  return 1;
}

JNIEXPORT jfloat JNICALL Java_com_cxp_test_dll_DllFuncService_getSum
  (JNIEnv* env, jobject obj, jfloatArray parametr) {
  float* parametrArray =  env -> GetFloatArrayElements(parametr, JNI_FALSE);
  // 1. 调试模式：打印入参参数
  jsize length = env->GetArrayLength(parametr);
  printf("[DEBUG] Input array length: %d\n", length);
  for (int i = 0; i < length; i++) {
    printf("[DEBUG] inArray[%d] = %f\n", i, parametrArray[i]);
  }
  // 2. 调用业务逻辑
  Agc* agc = Agc::GetInstance();
  agc->SetAgcActionValue(parametrArray, length);
  // 3. 释放数组资源（必须调用！）
  // GetFloatArrayElements 和 ReleaseFloatArrayElements 是成对出现的，必须配对。
  env->ReleaseFloatArrayElements(parametr, parametrArray, JNI_ABORT);
  // 4. 刷新标准输出缓冲区，确保之前的 printf 输出立即显示(就是将日志立即输出)
  fflush(stdout);
  return agc->GetAgcActionValue();
}